﻿using Springwater.DataAccessLayer.Repository;
using Springwater.Model;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Web.Mvc;
using System.ComponentModel.DataAnnotations;
using Springwater.Business.Util;

namespace Springwater.Business.ViewModels
{
    public class BorvizModel
    {
        public int Id { get; set; }
        public string ElsodlegesNev { get; set; }
        public string Kod { get; set; }
        public string Tajegyseg { get; set; }
        public string Eredet { get; set; }
        public string Leiras { get; set; }

        public string Allapot { get; set; }
        public string Forma { get; set; }
        public string Kiepitettseg { get; set; }
        public string KornyezetiVeszely { get; set; }

        public string GpsNord { get; set; }
        public string GpsEst { get; set; }
        public string Magassag { get; set; }
        public List<decimal> GpsList { get; set; }

        public List<string> NevList { get; set; }
        public List<string> VizgyujtoList { get; set; }

        public List<MeresModel> MeresList { get; set; }
        public List<FenykepModel> FenykepList { get; set; }

        #region Constructor

        public BorvizModel(Borviz borviz)
        {
            this.Id = borviz.Id;
            this.ElsodlegesNev = borviz.Elnevezes.FirstOrDefault(e => e.Elsodleges).Nev;
            this.Kod = borviz.Kod;
            this.Tajegyseg = borviz.Tajegyseg;
            this.Eredet = borviz.Eredet;
            this.Leiras = borviz.Leiras;
            this.NevList = borviz.Elnevezes.Where(e => !e.Elsodleges).Select(e => e.Nev).ToList();
            this.VizgyujtoList = borviz.Vizgyujtok.OrderBy(v => v.Rang).Select(v => v.Nev).ToList();

            if (borviz.Meresek.Count > 0)
            {
                var meresList = borviz.Meresek.OrderByDescending(m => m.Datum).ToList();

                this.Allapot = meresList.FirstOrDefault(m => !string.IsNullOrEmpty(m.Megfigyeles.Allapot)).Megfigyeles.Allapot;
                this.Forma = meresList.FirstOrDefault(m => !string.IsNullOrEmpty(m.Megfigyeles.Forma)).Megfigyeles.Forma;
                this.Kiepitettseg = meresList.FirstOrDefault(m => !string.IsNullOrEmpty(m.Megfigyeles.Kiepitettseg)).Megfigyeles.Kiepitettseg;
                this.KornyezetiVeszely = meresList.FirstOrDefault(m => !string.IsNullOrEmpty(m.Megfigyeles.KornyezetiVeszely)).Megfigyeles.KornyezetiVeszely;

                this.MeresList = meresList.Select(m => new MeresModel(m)).ToList();

                if (borviz.FoldfelsziniHelyzet != null)
                {
                    this.GpsEst = GpsUtil.ConvertDecimalToString(borviz.FoldfelsziniHelyzet.Longitude.Value);
                    this.GpsNord = GpsUtil.ConvertDecimalToString(borviz.FoldfelsziniHelyzet.Latitude.Value);

                    if (this.GpsEst.Length > 9) this.GpsEst = this.GpsEst.Substring(0, 9);
                    if (this.GpsNord.Length > 9) this.GpsNord = this.GpsNord.Substring(0, 9);

                    this.Magassag = borviz.FoldfelsziniHelyzet.Magassag.ToString();

                    if (borviz.FoldfelsziniHelyzet.Longitude.HasValue && borviz.FoldfelsziniHelyzet.Latitude.HasValue)
                    {
                        this.GpsList = new List<decimal>() { borviz.FoldfelsziniHelyzet.Latitude.Value, borviz.FoldfelsziniHelyzet.Longitude.Value };
                    }
                }
            }
            else
            {
                this.MeresList = new List<MeresModel>();
            }

            this.FenykepList = borviz.Fenykepek.OrderByDescending(f => f.Elsodleges).ThenByDescending(f => f.Datum).Select(f => new FenykepModel() { Path = f.File, Szerzo = f.Szerzo, Datum = f.Datum.ToString("d") }).ToList();          
        }

        #endregion
    }

    public class MeresModel
    {
        public string Dátum { get; set; }
        public string Gázfeltörés { get; set; }
        public string Hőmérséklet { get; set; }
        public string Vízhozam { get; set; }
        public string Kond { get; set; }
        public string TDS { get; set; }
        public string pH { get; set; }
        public string Sótartalom { get; set; }
        public string CO2 { get; set; }
        public string HCO3 { get; set; }
        public string Ca { get; set; }
        public string Mg { get; set; }
        public string NH4 { get; set; }
        public string NO3 { get; set; }
        public string Fe { get; set; }
        public string Cl { get; set; }
        public string PO4 { get; set; }
        public string Szerző { get; set; }

        public MeresModel(Meres meres)
        {
            this.Dátum = meres.Datum.ToShortDateString();
            this.Szerző = meres.Szerzo;
            this.Gázfeltörés = (meres.Gazfeltores.HasValue ? (meres.Gazfeltores.Value ? "Igen" : "Nem") : "-");
            this.Hőmérséklet = (meres.Homerseklet.HasValue ? meres.Homerseklet.ToString() : "-");

            if (meres.Vizhozam != null)
            {
                if (meres.Vizhozam.Elhanyagolhato == true) this.Vízhozam = "Elhanyagolható";
                if (meres.Vizhozam.NemMerheto == true) this.Vízhozam = "Nem mérhető";
                if (meres.Vizhozam.NemMerhetoNagyHozam == true) this.Vízhozam = "Nem mérhető - Nagy";
                if (meres.Vizhozam.Hozam.HasValue) this.Vízhozam = meres.Vizhozam.Hozam.ToString();
            }
            else
            {
                this.Vízhozam = "-";
            }

            this.Kond = (meres.Kond.HasValue ? meres.Kond.ToString() : "-");
            this.TDS = (meres.TDS.HasValue ? meres.TDS.ToString() : "-");
            this.pH = (meres.PH.HasValue ? meres.PH.ToString() : "-");
            this.Sótartalom = (meres.Sotartalom.HasValue ? meres.Sotartalom.ToString() : "-");
            this.CO2 = (meres.CO2.HasValue ? meres.CO2.ToString() : "-");
            this.HCO3 = (meres.HCO3.HasValue ? meres.HCO3.ToString() : "-");
            this.Ca = (meres.Ca.HasValue ? meres.Ca.ToString() : "-");
            this.Mg = (meres.Mg.HasValue ? meres.Mg.ToString() : "-");
            this.NH4 = (meres.NH4.HasValue ? meres.NH4.ToString() : "-");
            this.NO3 = (meres.NO3.HasValue ? meres.NO3.ToString() : "-");
            this.Fe = (meres.Fe.HasValue ? meres.Fe.ToString() : "-");
            this.Cl = (meres.Cl.HasValue ? meres.Cl.ToString() : "-");
            this.PO4 = (meres.PO4.HasValue ? meres.PO4.ToString() : "-");
        }
    }
}
